|
Packit |
f70c98 |
/* --------------------------------------------------------------------------
|
|
Packit |
f70c98 |
|
|
Packit |
f70c98 |
libmusicbrainz5 - Client library to access MusicBrainz
|
|
Packit |
f70c98 |
|
|
Packit |
f70c98 |
Copyright (C) 2012 Andrew Hawkins
|
|
Packit |
f70c98 |
|
|
Packit |
f70c98 |
This file is part of libmusicbrainz5.
|
|
Packit |
f70c98 |
|
|
Packit |
f70c98 |
This library is free software; you can redistribute it and/or
|
|
Packit |
f70c98 |
modify it under the terms of the GNU Lesser General Public
|
|
Packit |
f70c98 |
License as published by the Free Software Foundation; either
|
|
Packit |
f70c98 |
version 2.1 of the License, or (at your option) any later version.
|
|
Packit |
f70c98 |
|
|
Packit |
f70c98 |
libmusicbrainz5 is distributed in the hope that it will be useful,
|
|
Packit |
f70c98 |
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
Packit |
f70c98 |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
Packit |
f70c98 |
Lesser General Public License for more details.
|
|
Packit |
f70c98 |
|
|
Packit |
f70c98 |
You should have received a copy of the GNU General Public License
|
|
Packit |
f70c98 |
along with this library. If not, see <http://www.gnu.org/licenses/>.
|
|
Packit |
f70c98 |
|
|
Packit |
f70c98 |
$Id$
|
|
Packit |
f70c98 |
|
|
Packit |
f70c98 |
----------------------------------------------------------------------------*/
|
|
Packit |
f70c98 |
|
|
Packit |
f70c98 |
#include <iostream>
|
|
Packit |
f70c98 |
|
|
Packit |
f70c98 |
#include <strings.h>
|
|
Packit |
f70c98 |
|
|
Packit |
f70c98 |
#include "musicbrainz5/Query.h"
|
|
Packit |
f70c98 |
#include "musicbrainz5/Release.h"
|
|
Packit |
f70c98 |
#include "musicbrainz5/ReleaseGroup.h"
|
|
Packit |
f70c98 |
#include "musicbrainz5/Medium.h"
|
|
Packit |
f70c98 |
#include "musicbrainz5/MediumList.h"
|
|
Packit |
f70c98 |
#include "musicbrainz5/NameCredit.h"
|
|
Packit |
f70c98 |
#include "musicbrainz5/ArtistCredit.h"
|
|
Packit |
f70c98 |
#include "musicbrainz5/Artist.h"
|
|
Packit |
f70c98 |
#include "musicbrainz5/Alias.h"
|
|
Packit |
f70c98 |
#include "musicbrainz5/HTTPFetch.h"
|
|
Packit |
f70c98 |
#include "musicbrainz5/Track.h"
|
|
Packit |
f70c98 |
#include "musicbrainz5/Recording.h"
|
|
Packit |
f70c98 |
#include "musicbrainz5/Collection.h"
|
|
Packit |
f70c98 |
#include "musicbrainz5/CollectionList.h"
|
|
Packit |
f70c98 |
#include "musicbrainz5/RelationListList.h"
|
|
Packit |
f70c98 |
#include "musicbrainz5/RelationList.h"
|
|
Packit |
f70c98 |
#include "musicbrainz5/Relation.h"
|
|
Packit |
f70c98 |
#include "musicbrainz5/Work.h"
|
|
Packit |
f70c98 |
#include "musicbrainz5/ISWC.h"
|
|
Packit |
f70c98 |
#include "musicbrainz5/ISWCList.h"
|
|
Packit |
f70c98 |
#include "musicbrainz5/SecondaryType.h"
|
|
Packit |
f70c98 |
#include "musicbrainz5/SecondaryTypeList.h"
|
|
Packit |
f70c98 |
#include "musicbrainz5/IPI.h"
|
|
Packit |
f70c98 |
#include "musicbrainz5/IPIList.h"
|
|
Packit |
f70c98 |
#include "musicbrainz5/Lifespan.h"
|
|
Packit |
f70c98 |
|
|
Packit |
f70c98 |
void PrintRelationList(MusicBrainz5::CRelationList *RelationList)
|
|
Packit |
f70c98 |
{
|
|
Packit |
f70c98 |
std::cout << "Target type: '" << RelationList->TargetType() << "'" << std::endl;
|
|
Packit |
f70c98 |
|
|
Packit |
f70c98 |
for (int count=0;count<RelationList->NumItems();count++)
|
|
Packit |
f70c98 |
{
|
|
Packit |
f70c98 |
MusicBrainz5::CRelation *Relation=RelationList->Item(count);
|
|
Packit |
f70c98 |
std::cout << "Relation: " << count << " - Type '" << Relation->Type() << "', Target '" << Relation->Target() << "'" << std::endl;
|
|
Packit |
f70c98 |
}
|
|
Packit |
f70c98 |
}
|
|
Packit |
f70c98 |
|
|
Packit |
f70c98 |
int main(int argc, const char *argv[])
|
|
Packit |
f70c98 |
{
|
|
Packit Service |
1b21de |
MusicBrainz5::CQuery MB2("MBTest/v1.0","musicbrainz.org");
|
|
Packit |
f70c98 |
|
|
Packit |
f70c98 |
MusicBrainz5::CQuery::tParamMap Params5;
|
|
Packit |
f70c98 |
Params5["inc"]="aliases";
|
|
Packit |
f70c98 |
MusicBrainz5::CMetadata Metadata5=MB2.Query("artist","4b585938-f271-45e2-b19a-91c634b5e396","",Params5);
|
|
Packit |
f70c98 |
MusicBrainz5::CArtist *Artist=Metadata5.Artist();
|
|
Packit |
f70c98 |
if (Artist)
|
|
Packit |
f70c98 |
{
|
|
Packit |
f70c98 |
MusicBrainz5::CLifespan *Lifespan=Artist->Lifespan();
|
|
Packit |
f70c98 |
if (Lifespan)
|
|
Packit |
f70c98 |
{
|
|
Packit |
f70c98 |
std::cout << "Begin: " << Lifespan->Begin() << std::endl;
|
|
Packit |
f70c98 |
std::cout << "End: " << Lifespan->End() << std::endl;
|
|
Packit |
f70c98 |
std::cout << "Ended: " << Lifespan->Ended() << std::endl;
|
|
Packit |
f70c98 |
}
|
|
Packit |
f70c98 |
}
|
|
Packit |
f70c98 |
|
|
Packit Service |
1b21de |
// return 0;
|
|
Packit |
f70c98 |
|
|
Packit |
f70c98 |
MusicBrainz5::CMetadata Metadata8=MB2.Query("release-group","2eefe885-f050-426d-93f0-29c5eb8b4f9a");
|
|
Packit |
f70c98 |
std::cout << Metadata8 << std::endl;
|
|
Packit Service |
1b21de |
// return 0;
|
|
Packit |
f70c98 |
|
|
Packit |
f70c98 |
MusicBrainz5::CMetadata Metadata7=MB2.Query("artist","4b585938-f271-45e2-b19a-91c634b5e396");
|
|
Packit |
f70c98 |
Artist=Metadata7.Artist();
|
|
Packit |
f70c98 |
if (Artist)
|
|
Packit |
f70c98 |
{
|
|
Packit |
f70c98 |
MusicBrainz5::CIPIList *IPIList=Artist->IPIList();
|
|
Packit |
f70c98 |
if (IPIList)
|
|
Packit |
f70c98 |
{
|
|
Packit |
f70c98 |
for (int count=0;count<IPIList->NumItems();count++)
|
|
Packit |
f70c98 |
{
|
|
Packit |
f70c98 |
MusicBrainz5::CIPI *IPI=IPIList->Item(count);
|
|
Packit |
f70c98 |
if (IPI)
|
|
Packit |
f70c98 |
{
|
|
Packit |
f70c98 |
std::cout << "IPI " << count << ": " << IPI->IPI() << std::endl;
|
|
Packit |
f70c98 |
}
|
|
Packit |
f70c98 |
}
|
|
Packit |
f70c98 |
}
|
|
Packit |
f70c98 |
}
|
|
Packit |
f70c98 |
|
|
Packit Service |
1b21de |
// return 0;
|
|
Packit |
f70c98 |
|
|
Packit |
f70c98 |
MusicBrainz5::CMetadata Metadata6=MB2.Query("release-group","2eefe885-f050-426d-93f0-29c5eb8b4f9a");
|
|
Packit |
f70c98 |
MusicBrainz5::CReleaseGroup *ReleaseGroup=Metadata6.ReleaseGroup();
|
|
Packit |
f70c98 |
if (ReleaseGroup)
|
|
Packit |
f70c98 |
{
|
|
Packit |
f70c98 |
std::cout << "ID: " << ReleaseGroup->ID() << std::endl;
|
|
Packit |
f70c98 |
std::cout << "PrimaryType: " << ReleaseGroup->PrimaryType() << std::endl;
|
|
Packit |
f70c98 |
std::cout << "Title: " << ReleaseGroup->Title() << std::endl;
|
|
Packit |
f70c98 |
std::cout << "Disambiguation: " << ReleaseGroup->Disambiguation() << std::endl;
|
|
Packit |
f70c98 |
std::cout << "FirstReleaseDate: " << ReleaseGroup->FirstReleaseDate() << std::endl;
|
|
Packit |
f70c98 |
|
|
Packit |
f70c98 |
MusicBrainz5::CSecondaryTypeList *SecondaryTypeList=ReleaseGroup->SecondaryTypeList();
|
|
Packit |
f70c98 |
if (SecondaryTypeList)
|
|
Packit |
f70c98 |
{
|
|
Packit |
f70c98 |
for (int count=0;count<SecondaryTypeList->NumItems();count++)
|
|
Packit |
f70c98 |
{
|
|
Packit |
f70c98 |
MusicBrainz5::CSecondaryType *SecondaryType=SecondaryTypeList->Item(count);
|
|
Packit |
f70c98 |
if (SecondaryType)
|
|
Packit |
f70c98 |
{
|
|
Packit |
f70c98 |
std::cout << "Secondary type " << count << " = " << SecondaryType->SecondaryType() << std::endl;
|
|
Packit |
f70c98 |
}
|
|
Packit |
f70c98 |
}
|
|
Packit |
f70c98 |
}
|
|
Packit |
f70c98 |
}
|
|
Packit |
f70c98 |
|
|
Packit Service |
1b21de |
// return 0;
|
|
Packit |
f70c98 |
|
|
Packit |
f70c98 |
MusicBrainz5::CMetadata Metadata4=MB2.Query("work","b0d17375-5593-390e-a936-1a65ce74c630");
|
|
Packit |
f70c98 |
|
|
Packit |
f70c98 |
MusicBrainz5::CWork *ThisWork=Metadata4.Work();
|
|
Packit |
f70c98 |
if (ThisWork)
|
|
Packit |
f70c98 |
{
|
|
Packit |
f70c98 |
std::cout << "ID: '" << ThisWork->ID() << "'" << std::endl;
|
|
Packit |
f70c98 |
std::cout << "Title: '" << ThisWork->Title() << "'" << std::endl;
|
|
Packit |
f70c98 |
|
|
Packit |
f70c98 |
MusicBrainz5::CISWCList *ISWCList=ThisWork->ISWCList();
|
|
Packit |
f70c98 |
if (ISWCList)
|
|
Packit |
f70c98 |
{
|
|
Packit |
f70c98 |
for (int count=0;count<ISWCList->NumItems();count++)
|
|
Packit |
f70c98 |
{
|
|
Packit |
f70c98 |
MusicBrainz5::CISWC *ISWC=ISWCList->Item(count);
|
|
Packit |
f70c98 |
std::cout << "ISWC " << count << " - '" << ISWC->ISWC() << "'" << std::endl;
|
|
Packit |
f70c98 |
}
|
|
Packit |
f70c98 |
}
|
|
Packit |
f70c98 |
|
|
Packit |
f70c98 |
std::cout << "Disambiguation: '" << ThisWork->Disambiguation() << "'" << std::endl;
|
|
Packit |
f70c98 |
std::cout << "Language: '" << ThisWork->Language() << "'" << std::endl;
|
|
Packit |
f70c98 |
}
|
|
Packit |
f70c98 |
|
|
Packit |
f70c98 |
MusicBrainz5::CQuery::tParamMap Params3;
|
|
Packit |
f70c98 |
Params3["inc"]="media recordings";
|
|
Packit |
f70c98 |
|
|
Packit |
f70c98 |
Metadata4=MB2.Query("release","ae050d13-7f86-495e-9918-10d8c0ac58e8","",Params3);
|
|
Packit |
f70c98 |
MusicBrainz5::CRelease *Release2=Metadata4.Release();
|
|
Packit |
f70c98 |
if (Release2)
|
|
Packit |
f70c98 |
{
|
|
Packit |
f70c98 |
MusicBrainz5::CMediumList *MediumList=Release2->MediumList();
|
|
Packit |
f70c98 |
if (MediumList)
|
|
Packit |
f70c98 |
{
|
|
Packit |
f70c98 |
for (int count=0;count<MediumList->NumItems();count++)
|
|
Packit |
f70c98 |
{
|
|
Packit |
f70c98 |
MusicBrainz5::CMedium *Medium=MediumList->Item(count);
|
|
Packit |
f70c98 |
if (Medium)
|
|
Packit |
f70c98 |
{
|
|
Packit |
f70c98 |
MusicBrainz5::CTrackList *TrackList=Medium->TrackList();
|
|
Packit |
f70c98 |
if (TrackList)
|
|
Packit |
f70c98 |
{
|
|
Packit |
f70c98 |
for (int track=0;track<TrackList->NumItems();track++)
|
|
Packit |
f70c98 |
{
|
|
Packit |
f70c98 |
MusicBrainz5::CTrack *Track=TrackList->Item(track);
|
|
Packit |
f70c98 |
if (Track)
|
|
Packit |
f70c98 |
{
|
|
Packit |
f70c98 |
std::cout << "Position: " << Track->Position() << std::endl;
|
|
Packit |
f70c98 |
std::cout << "Title: " << Track->Title() << std::endl;
|
|
Packit |
f70c98 |
std::cout << "Length: " << Track->Length() << std::endl;
|
|
Packit |
f70c98 |
std::cout << "Number: " << Track->Number() << std::endl;
|
|
Packit |
f70c98 |
}
|
|
Packit |
f70c98 |
}
|
|
Packit |
f70c98 |
}
|
|
Packit |
f70c98 |
}
|
|
Packit |
f70c98 |
}
|
|
Packit |
f70c98 |
}
|
|
Packit |
f70c98 |
}
|
|
Packit |
f70c98 |
|
|
Packit Service |
1b21de |
// return 0;
|
|
Packit |
f70c98 |
|
|
Packit |
f70c98 |
MusicBrainz5::CQuery MB("MBTest/v1.0");
|
|
Packit |
f70c98 |
|
|
Packit |
f70c98 |
if (argc>1)
|
|
Packit |
f70c98 |
{
|
|
Packit |
f70c98 |
std::cout << "Setting username: '" << argv[1] << "'" << std::endl;
|
|
Packit |
f70c98 |
MB.SetUserName(argv[1]);
|
|
Packit |
f70c98 |
}
|
|
Packit |
f70c98 |
|
|
Packit |
f70c98 |
if (argc>2)
|
|
Packit |
f70c98 |
{
|
|
Packit |
f70c98 |
std::cout << "Setting password: '" << argv[2] << "'" << std::endl;
|
|
Packit |
f70c98 |
MB.SetPassword(argv[2]);
|
|
Packit |
f70c98 |
}
|
|
Packit |
f70c98 |
|
|
Packit |
f70c98 |
MusicBrainz5::CQuery::tParamMap Params2;
|
|
Packit |
f70c98 |
Params2["inc"]="artists release-groups url-rels work-level-rels work-rels artist-rels";
|
|
Packit |
f70c98 |
MusicBrainz5::CMetadata Metadata3=MB.Query("recording","3631f569-520d-40ff-a1ee-076604723275","",Params2);
|
|
Packit |
f70c98 |
MusicBrainz5::CRecording *Recording=Metadata3.Recording();
|
|
Packit |
f70c98 |
if (Recording)
|
|
Packit |
f70c98 |
{
|
|
Packit |
f70c98 |
MusicBrainz5::CRelationListList *RelationListList=Recording->RelationListList();
|
|
Packit |
f70c98 |
for (int count=0;count<RelationListList->NumItems();count++)
|
|
Packit |
f70c98 |
{
|
|
Packit |
f70c98 |
MusicBrainz5::CRelationList *RelationList=RelationListList->Item(count);
|
|
Packit |
f70c98 |
PrintRelationList(RelationList);
|
|
Packit |
f70c98 |
}
|
|
Packit |
f70c98 |
}
|
|
Packit |
f70c98 |
|
|
Packit Service |
1b21de |
// return 0;
|
|
Packit |
f70c98 |
|
|
Packit |
f70c98 |
MusicBrainz5::CQuery::tParamMap Params;
|
|
Packit |
f70c98 |
Params["inc"]="artists labels recordings release-groups url-rels discids recording-level-rels work-level-rels work-rels artist-rels";
|
|
Packit |
f70c98 |
|
|
Packit |
f70c98 |
MusicBrainz5::CMetadata Metadata2=MB.Query("release","ef4596f0-5554-443a-aea9-247d2e250f61","",Params);
|
|
Packit |
f70c98 |
|
|
Packit |
f70c98 |
MusicBrainz5::CRelease *Release=Metadata2.Release();
|
|
Packit |
f70c98 |
if (Release)
|
|
Packit |
f70c98 |
{
|
|
Packit |
f70c98 |
MusicBrainz5::CMediumList *MediumList=Release->MediumList();
|
|
Packit |
f70c98 |
|
|
Packit |
f70c98 |
if (MediumList)
|
|
Packit |
f70c98 |
{
|
|
Packit |
f70c98 |
for (int MediumNum=0;MediumNum<MediumList->NumItems();MediumNum++)
|
|
Packit |
f70c98 |
{
|
|
Packit |
f70c98 |
MusicBrainz5::CMedium *Medium=MediumList->Item(MediumNum);
|
|
Packit |
f70c98 |
if (Medium)
|
|
Packit |
f70c98 |
{
|
|
Packit |
f70c98 |
MusicBrainz5::CTrackList *TrackList=Medium->TrackList();
|
|
Packit |
f70c98 |
if (TrackList)
|
|
Packit |
f70c98 |
{
|
|
Packit |
f70c98 |
for (int TrackNum=0;TrackNum<TrackList->NumItems();TrackNum++)
|
|
Packit |
f70c98 |
{
|
|
Packit |
f70c98 |
MusicBrainz5::CTrack *Track=TrackList->Item(TrackNum);
|
|
Packit |
f70c98 |
if (Track)
|
|
Packit |
f70c98 |
{
|
|
Packit |
f70c98 |
MusicBrainz5::CRecording *Recording=Track->Recording();
|
|
Packit |
f70c98 |
if (Recording)
|
|
Packit |
f70c98 |
{
|
|
Packit |
f70c98 |
MusicBrainz5::CRelationListList *RelationListList=Recording->RelationListList();
|
|
Packit |
f70c98 |
if (RelationListList)
|
|
Packit |
f70c98 |
{
|
|
Packit |
f70c98 |
std::cout << RelationListList->NumItems() << " items" << std::endl;
|
|
Packit |
f70c98 |
for (int RelationListNum=0;RelationListNum<RelationListList->NumItems();RelationListNum++)
|
|
Packit |
f70c98 |
{
|
|
Packit |
f70c98 |
MusicBrainz5::CRelationList *RelationList=RelationListList->Item(RelationListNum);
|
|
Packit |
f70c98 |
PrintRelationList(RelationList);
|
|
Packit |
f70c98 |
}
|
|
Packit |
f70c98 |
}
|
|
Packit |
f70c98 |
}
|
|
Packit |
f70c98 |
}
|
|
Packit |
f70c98 |
}
|
|
Packit |
f70c98 |
}
|
|
Packit |
f70c98 |
}
|
|
Packit |
f70c98 |
}
|
|
Packit |
f70c98 |
}
|
|
Packit |
f70c98 |
}
|
|
Packit |
f70c98 |
|
|
Packit Service |
1b21de |
// return 0;
|
|
Packit |
f70c98 |
|
|
Packit |
f70c98 |
MusicBrainz5::CMetadata Metadata=MB.Query("collection");
|
|
Packit |
f70c98 |
MusicBrainz5::CCollectionList *CollectionList=Metadata.CollectionList();
|
|
Packit |
f70c98 |
if (CollectionList && 0!=CollectionList->NumItems())
|
|
Packit |
f70c98 |
{
|
|
Packit |
f70c98 |
MusicBrainz5::CCollection *Collection=CollectionList->Item(0);
|
|
Packit |
f70c98 |
std::cout << "ID is " << Collection->ID() << std::endl;
|
|
Packit |
f70c98 |
|
|
Packit |
f70c98 |
MB.Query("collection",Collection->ID(),"releases");
|
|
Packit |
f70c98 |
|
|
Packit |
f70c98 |
std::vector<std::string> Releases;
|
|
Packit |
f70c98 |
Releases.push_back("b5748ac9-f38e-48f7-a8a4-8b43cab025bc");
|
|
Packit |
f70c98 |
Releases.push_back("f6335672-c521-4129-86c3-490d20533e08");
|
|
Packit |
f70c98 |
bool Ret=MB.AddCollectionEntries(Collection->ID(),Releases);
|
|
Packit |
f70c98 |
std::cout << "AddCollectionEntries returns " << std::boolalpha << Ret << std::endl;
|
|
Packit |
f70c98 |
|
|
Packit |
f70c98 |
MB.Query("collection",Collection->ID(),"releases");
|
|
Packit |
f70c98 |
|
|
Packit |
f70c98 |
Releases.clear();
|
|
Packit |
f70c98 |
Releases.push_back("b5748ac9-f38e-48f7-a8a4-8b43cab025bc");
|
|
Packit |
f70c98 |
Ret=MB.DeleteCollectionEntries(Collection->ID(),Releases);
|
|
Packit |
f70c98 |
std::cout << "DeleteCollectionEntries returns " << std::boolalpha << Ret << std::endl;
|
|
Packit |
f70c98 |
|
|
Packit |
f70c98 |
MB.Query("collection",Collection->ID(),"releases");
|
|
Packit |
f70c98 |
}
|
|
Packit |
f70c98 |
|
|
Packit Service |
1b21de |
// return 0;
|
|
Packit |
f70c98 |
|
|
Packit |
f70c98 |
std::string DiscID="arIS30RPWowvwNEqsqdDnZzDGhk-";
|
|
Packit |
f70c98 |
|
|
Packit |
f70c98 |
if (argc==2)
|
|
Packit |
f70c98 |
DiscID=argv[1];
|
|
Packit |
f70c98 |
|
|
Packit |
f70c98 |
MusicBrainz5::CReleaseList ReleaseList=MB.LookupDiscID(DiscID);
|
|
Packit |
f70c98 |
|
|
Packit |
f70c98 |
for (int count=0;count
|
|
Packit |
f70c98 |
{
|
|
Packit |
f70c98 |
MusicBrainz5::CRelease *Release=ReleaseList.Item(count);
|
|
Packit |
f70c98 |
|
|
Packit |
f70c98 |
MusicBrainz5::CRelease FullRelease=MB.LookupRelease(Release->ID());
|
|
Packit |
f70c98 |
|
|
Packit |
f70c98 |
std::cout << "Full release: " << std::endl;
|
|
Packit |
f70c98 |
|
|
Packit |
f70c98 |
std::cout << FullRelease << std::endl;
|
|
Packit |
f70c98 |
|
|
Packit |
f70c98 |
std::cout << "Release group title: '" << FullRelease.ReleaseGroup()->Title() << "'" << std::endl;
|
|
Packit |
f70c98 |
|
|
Packit |
f70c98 |
std::cout << std::endl << std::endl << "Media matching " << DiscID << ":" << std::endl;
|
|
Packit |
f70c98 |
|
|
Packit |
f70c98 |
MusicBrainz5::CMediumList MediaList=FullRelease.MediaMatchingDiscID(DiscID);
|
|
Packit |
f70c98 |
|
|
Packit |
f70c98 |
for (int count=0;count
|
|
Packit |
f70c98 |
{
|
|
Packit |
f70c98 |
MusicBrainz5::CMedium *Medium=MediaList.Item(count);
|
|
Packit |
f70c98 |
|
|
Packit |
f70c98 |
std::cout << *Medium << std::endl;
|
|
Packit |
f70c98 |
}
|
|
Packit |
f70c98 |
|
|
Packit |
f70c98 |
std::cout << std::endl << std::endl;
|
|
Packit |
f70c98 |
}
|
|
Packit |
f70c98 |
|
|
Packit |
f70c98 |
return 0;
|
|
Packit |
f70c98 |
}
|