flash on 2009-11-12

by keim_at_Si
♥6 | Line 541 | Modified 2009-11-24 23:36:51 | MIT License
play

ActionScript3 source code

/**
 * Copyright keim_at_Si ( http://wonderfl.net/user/keim_at_Si )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/pZBt
 */

package {
    import flash.display.*;
    
    [SWF(width="465", height="465", backgroundColor="0xffffff", frameRate="30")]
    public class main extends Sprite {
        private var sceneSelect:SceneSelect = new SceneSelect();
        private var sceneGame  :SceneGame   = new SceneGame();
        
        function main() {
            WonderflAPI.apiKey = loaderInfo.parameters.open_api_key;
            sceneSelect.nextScene = sceneGame;
            Layer.initialize(this);
            sceneSelect.enterScene();
        }
    }
}


import com.adobe.serialization.json.JSON;
import flash.display.*;
import flash.events.*;
import flash.geom.*;
import flash.net.*;
import flash.system.*;
import flash.utils.*;
import com.bit101.components.*;
import org.libspark.betweenas3.*;
import org.libspark.betweenas3.tweens.*;
import org.libspark.betweenas3.easing.*;
import frocessing.utils.FLoadUtil;

// Layer
//--------------------------------------------------
class Layer {
    static public var back  :Sprite = new Sprite();
    static public var card  :Sprite = new Sprite();
    static public var window:Sprite = new Sprite();
    static public function initialize(main:Sprite) : void {
        main.addChild(back);
        main.addChild(card);
        main.addChild(window);
        WCard.drawBackImage();
    }
    static public function setCard(c:WCard, x:Number, y:Number, rev:Boolean=false) : WCard { 
        if (c.parent == null) card.addChild(c);
        return c.pos(x, y, rev);
    }
    static public function removeAllWindows() : void {
        while (window.numChildren>0) window.removeChildAt(0);
    }
}

// Scene
//--------------------------------------------------
class SceneSprite extends Sprite {
    public var operator:Panel = new Panel(null, 0, 440);
    public var windows:Vector.<DisplayObject> = null;
    public var nextScene:SceneSprite = null;
    function SceneSprite() {
        operator.setSize(465, 25);
        graphics.beginFill(0xeeeeff);
        graphics.drawRect(0, 0, 465, 465);
        graphics.endFill();
    }
    public function enterScene() : void {
        Layer.back.addChildAt(this, 0);
        Layer.window.addChild(operator);
        if (windows) for each (var d:DisplayObject in windows) Layer.window.addChild(d);
        onEnterScene();
    }
    public function exitScene(time:Number) : void {
        Layer.removeAllWindows();
        var t:ITween = BetweenAS3.serial(
            BetweenAS3.tween(this, {y:440}, {y:0}, time, Bounce.easeOut), 
            BetweenAS3.removeFromParent(this), BetweenAS3.func(onExitScene)
        );
        t.play();
        nextScene.enterScene();
    }
    protected function onEnterScene() : void { }
    protected function onExitScene() : void { }
    protected function button(x:Number, label:String, func:Function, width:Number) : PushButton {
        var b:PushButton = new PushButton(operator.content, x, 4, label, func);
        b.setSize(width, 16);
        return b;
    }
    protected function label(x:Number, label:String, width:Number) : Label {
        var l:Label = new Label(operator.content, x, 4, label)
        l.setSize(width, 16);
        return l;
    }
    protected function window(...wnds) : SceneSprite {
        windows = Vector.<DisplayObject>(wnds);
        return this;
    }
}

class SceneSelect extends SceneSprite {
    private var _selector:FloatingSelector = new FloatingSelector(_onSelected);
    function SceneSelect() { 
        window(_selector);
        label(72, "Input Project Team Members Name.", 240);
        button(4, "Game Start", _onStartGame, 64);
        button(377, "Sample Users", _onSelButton, 80);
        for (var i:int=0; i<4; i++) UserDisplay.displays[i] = new UserDisplay(this, i);
        UserDisplay.displays[0].setFocus();
/*
        for (i=0; i<4; i++) UserDisplay.displays[i].userName = "d";
*/    }
    private function _onSelButton(e:Event) : void { _selector.visible = !_selector.visible; }
    private function _onSelected(name:String) : void { if (UserDisplay.selected) UserDisplay.selected.userName = name; }
    private function _onStartGame(e:Event) : void { if (UserDisplay.startGame()) exitScene(2); }
}

class SceneGame extends SceneSprite {
    private var _message:MessageWindow = new MessageWindow();
    function SceneGame() {
        window(_message);
    }
    override protected function onEnterScene() : void { _message.popup("Loading AI ..."); }
    override protected function onExitScene() : void { }
}


// UI
//--------------------------------------------------
class UserDisplay extends Panel {
    static public var selected:UserDisplay = null;
    static public var displays:Vector.<UserDisplay> = new Vector.<UserDisplay>(4);
    static public function startGame() : Boolean { 
        var i:int;
        for (i=0; i<4; i++) if (!displays[i].userName) return false;
        for (i=0; i<4; i++) displays[i].startGame();
        return true; 
    }
    
    public var user:WUser = null, index:int;
    private var status:Label, message:Label, progBar:ProgressBar, nameInput:InputText, load:PushButton, back:Shape;
    
    public function get userName() : String { return (user && user.userData.isAvailable) ? user.userData.userName : null; }
    public function set userName(name:String) : void { nameInput.text = name; _onSetUser(null); }
    
    function UserDisplay(parent:DisplayObjectContainer, index:int) {
        super(parent, 0, index*110);
        this.index = index;
        setSize(465, 110);
        content.addChild(back = new Shape());
        back.graphics.beginFill(0x8080c0, 0.5);
        back.graphics.drawRect(0, 0, 465, 110);
        back.graphics.endFill();
        back.visible = false;
        status = new Label(content, 8, 72, "");
        message = new Label(content, 112, 52, "loading error !!");
        progBar = new ProgressBar(content, 8, 48);
        nameInput = new InputText(content, 8, 88);
        nameInput.setSize(64, 16);
        load = new PushButton(content, 76, 88, "load", _onSetUser);
        load.setSize(28, 16);
        message.visible = progBar.visible = false;
        addEventListener("focusIn", _onFocusIn);
        addEventListener("keyDown", _onKeyDown);
    }
    
    public function setFocus() : void { _onFocusIn(null); }
    public function startGame() : void {
        WUser.deleteCache(userName);
        for (var i:int = 0; i<user.suit.length; i++) 
            user.suit[i].to(40, 408, true, 0.5, (3-index+i*0.08)*0.5, !(index==0 && i==0));
    }
    
    private function _removeAll() : void {
        if (user) {
            content.removeChild(user.userData.userIcon);
            for each (var c:WCard in user.suit) if (c.parent) c.parent.removeChild(c);
            user = null;
        }
    }
    private function _onFocusIn(e:Event) : void { 
        for each(var d:UserDisplay in displays) d.back.visible = false;
        selected = this;
        back.visible = true;
    }
    private function _onKeyDown(e:KeyboardEvent) : void { if (e.keyCode == 13) _onSetUser(null); }
    private function _onSetUser(e:Event) : void {
        if (progBar.visible) return;
        message.visible = false;
        _removeAll();
        var name:String = nameInput.text;
        for each(var d:UserDisplay in displays) if (d.userName == name) { nameInput.text = ""; return; }
        user = WUser.getCache(name);
        if (user == null) {
            addEventListener("enterFrame", _onLoading);
            progBar.visible = true;
            status.text = "loading...";
            user = new WUser(name, _onFinished);
        } else _onFinished(true);
    }
    private function _onFinished(succ:Boolean) : void {
        removeEventListener("enterFrame", _onLoading);
        message.visible = progBar.visible = false;
        if (succ) {
            with (content.addChild(user.userData.userIcon)) { x=y=8; scaleX=scaleY=0.64; };
            status.text = "Gain:" + String(user.gain);
            for (var i:int = 0; i<user.suit.length; i++) {
                var cx:Number = this.x + (i%6)*55 + 154, cy:Number = this.y + ((i>=6)?82:27);
                Layer.setCard(user.suit[i], this.x + 100, this.y + 55, true).to(cx, cy, false, 0.8, 1-i*0.08);
            }
        } else {
            message.visible = true;
            user = null;
        }
    }
    private function _onLoading(e:Event) : void { progBar.value = user.userData.progress; }
}

class FloatingSelector extends Window {
    public var items:Vector.<PushButton> = new Vector.<PushButton>(12);
    public var slider:VSlider, sliderPos:int, _funcSelected:Function, close:PushButton;
    
    function FloatingSelector(funcSelected:Function) {
        super(null, 329, 16, "Sample Users");
        setSize(120, 212);
        close = new PushButton(this, 104, 4, "x", function(e:Event):void { visible = false; });
        close.setSize(14, 14)
        visible = false;
        for (var i:int = 0; i<12; i++) {
            items[i] = new PushButton(content, 0, i*16, "", _onSelected);
            items[i].setSize(108, 16);
        }
        slider = new VSlider(content, 108, 0, _onSlide);
        slider.setSize(12, 192);
        slider.value = 100;
        slider.backClick = true;
        _onSlide(null);
        _funcSelected = funcSelected;
    }
    
    private function _onSelected(e:Event) : void { _funcSelected(userList[int(e.target.y*0.0625+0.5)+sliderPos]); }
    private function _onSlide(e:Event) : void {
        sliderPos = 87 - int(slider.value * 0.87);
        for (var i:int = 0; i<12; i++) items[i].label = userList[i+sliderPos];
    }
}

class MessageWindow extends Window {
    private var _tf:Text, _by:PushButton, _bn:PushButton;
    function MessageWindow() {
        super(null, 132, 200, "Message Window");
        setSize(200, 80);
        _tf = new Text(content, 0, 0);
        _tf.editable = false;
        _tf.setSize(200, 80);
        (_by = new PushButton(content, 19,62,"YES")).setSize(80, 16);
        (_bn = new PushButton(content,101,62,"NO" )).setSize(80, 16);
        visible = false;
    }
    public function popup(msg:String, funcYes:Function=null, funcNo:Function=null) : void { 
        _tf.text = msg;
        visible = true;
        setSize(200, (funcYes != null) ? 80 : 60);
        _by.visible = (funcYes != null);
        _bn.visible = (funcNo  != null);
        _by.x = (funcNo != null) ? 19 : 60;
    }
}

// Cards
//--------------------------------------------------
class WUser {
    static private var _cache:* = {};
    static public function getCache(name:String) : WUser { return _cache[name]; }
    static public function deleteCache(name:String) : void { delete _cache[name]; }
    public var userData:WonderflUserData = new WonderflUserData();
    public var suit:Vector.<WCard> = new Vector.<WCard>();
    public var gain:int;
    private var _funcFinished:Function;
    
    function WUser(name:String, funcFinished:Function) {
        _funcFinished = funcFinished;
/**/
        if (name == 'd') userData.dummy(_onFinished);
        else userData.load(name, _onFinished);
    }
    
    private function _onFinished(data:WonderflUserData) : void {
        if (data != null) {
            var fav:int = 0;
            suit.length = 0;
            for each (var codeData:WonderflCodeData in userData.codes) {
                suit.push(new WCard(codeData));
                fav += codeData.favoriteCount + codeData.forkedCount;
                if (suit.length == 12) break;
            }
            gain = 30 - (fav >> 6) * 10 + ((fav == 0) ? 10 : 0);
            if (gain < 0) gain = 0;
            _cache[userData.userName] = this;
        }
        _funcFinished(data != null);
    }
}

class WCard extends Sprite {
    static public var libTables:Array = [
        ["tweener", "tweenlite", "tweenmax", "tweensy", "betweenas3", "box2d", "jiglib"], // motion (1)
        ["papervision3d", "sandy3d", "alternativa3d", "five3d"],                          // 3D (2)
        ["sion", "flashmedia"], ["frocessing", "stardust"],                               // media (3), drawing (4)
        ["union", "modestmaps", "googlemaps", "progression", "thread", "funnel"]          // service & framework (5)
    ];
    static public var libColor:Array = [0xc0c0c0, 0x80c080, 0xc08080, 0x8080c0, 0xc0c080, 0x80c0c0];
    static public var backImage:BitmapData = new BitmapData(54, 54, false);
    static public function drawBackImage() : void {
        backImage.fillRect(new Rectangle(0,0,54,54), 0xffffff);
        backImage.fillRect(new Rectangle(6,6,42,42), 0xc04040);
        Style.LABEL_TEXT = 0xffffff;
        var t:Label = new Label(null,0,0,"Wonderfl");
        t.draw();
        backImage.draw(t, new Matrix(1,0,0,1,8,16));
    }
    static public function newBackBitmap() : Bitmap {
        var back:Bitmap = new Bitmap(new BitmapData(54, 54, false));
        back.bitmapData.copyPixels(backImage, backImage.rect, backImage.rect.topLeft);
        return back;
    }
    
    public var codeData:WonderflCodeData;
    public var cost:int, value:int, isShort:Boolean, library:int, uniqueNum:int=0;
    public var iconLayer:BitmapData = new BitmapData(54, 54, true, 0);
    public var front:Sprite = new Sprite(), back:Bitmap;
    
    function WCard(codeData:WonderflCodeData) {
        this.codeData = codeData;
        var i:int, hex:String;
        cost  = int((codeData.favoriteCount+9.5)*0.1) * 10;
        value = codeData.favoriteCount+codeData.forkedCount;
        value = int(Math.sqrt(value)*0.9+0.2) * 10 + ((codeData.lineCount < 500) ? 10 : 0);
        isShort = (codeData.lineCount < 100);
        for (i=0, library=0; i<5; i++) if (codeData.checkLib(libTables[i])) library = i+1;
        if (library != 0 && value >= 20) value -= 10;
        if (cost  >= 100) cost  = 100;
        if (value >= 100) value = 100;
        for each(hex in codeData.id.match(/\w\w/g)) uniqueNum = (uniqueNum + parseInt(hex, 16)) & 255;
        front.graphics.beginFill(libColor[library], 1);
        front.graphics.drawRoundRect(0, 0, 54, 54, 4);
        front.graphics.endFill();
        with (front.addChild(codeData.thumbnail)) { 
            x = y = 4;
            scaleY = scaleX = 46/width; 
        }
        front.addChild(new Bitmap(iconLayer));
        _drawText( 0, -2, String(value) + "/" + String(cost) + ((isShort) ? "/S" : ""));
        if (library != 0) _drawText(40, 38, ["T","3D","M","D","SF"][library-1]);
        
        back = newBackBitmap();
        back.rotationY = 180;
        back.visible = false;
        
        with(addChild(front)){ x=y=-27; }
        with(addChild(back)){ x=-(y=-27); }
        
        buttonMode = true;
        addEventListener("click", function(e:Event): void { 
            navigateToURL(new URLRequest("http://wonderfl.net/code/" + codeData.id));
        });
    }
    
    public function pos(dx:Number, dy:Number, reversed:Boolean=false) : WCard {
        x = dx;
        y = dy;
        rotationY = (reversed) ? 180 : 0;
        return this;
    }
    public function to(x:Number, y:Number, reversed:Boolean=false, time:Number=1, delay:Number=0, andRemove:Boolean=false) : WCard {
        var t:ITween = BetweenAS3.to(this, {"x":x, "y":y, "rotationY":(reversed) ? 180 : 0}, time, Quad.easeInOut);
        t.onUpdate = _onUpdate;
        if (delay > 0) t = BetweenAS3.delay(t, delay);
        if (andRemove) t = BetweenAS3.serial(t, BetweenAS3.removeFromParent(this));
        t.play();
        return this;
    }
    
    private function _onUpdate() : void { front.visible = !(back.visible = (rotationY > 90)); }
    private function _drawText(x:Number, y:Number, text:String) : void {
        Style.LABEL_TEXT = 0xffffffff;
        if (!wtf) wtf = new Label(null, 0, 0, "");
        Style.LABEL_TEXT = 0xff000000;
        if (!btf) btf = new Label(null, 0, 0, "");
        btf.text = wtf.text = text; wtf.draw(); btf.draw(); 
        mat.tx = x;   mat.ty = y-1; iconLayer.draw(wtf, mat);
        mat.tx = x;   mat.ty = y+1; iconLayer.draw(wtf, mat);
        mat.tx = x-1; mat.ty = y;   iconLayer.draw(wtf, mat);
        mat.tx = x+1; mat.ty = y;   iconLayer.draw(wtf, mat);
        mat.tx = x;   mat.ty = y;   iconLayer.draw(btf, mat);
    }
    static private var wtf:Label=null, btf:Label=null, mat:Matrix = new Matrix(1,0,0,1,0,0);
}


// user samples
//--------------------------------------------------
var userList:Array = [ // fav>=50 @ 2009/11/16
"clockmaker","keim_at_Si","Saqoosha","tail_y","alumican_net","miyaoka","nutsu","sake","yd_niku","k3lab",
"Aquioux","makc3d","soundkitchen","k0rin","bkzen","psyark","keno42","nemu90kWw","uwi","shapevent",
"5ivestar","nitoyon","mrdoob","umhr","Nao_u","fumix","mtok","miniapp","HaraMakoto","coppieee",
"paq", "178ep3", "fladdict", "Hiiragi","yooKo","mash","9re","onedayitwillmake","beinteractive","a24",
"shotaicho","minon","demouth","ton","ABA","twistcube","yanbaka","rect","Murai","ll_koba_ll",
"naoto5959","knd","Kay","peko","northprint","hikipuro","enok","matsu4512","misty","wanson",
"zahir","set0","cellfusion","abakane","seyself", "tkinjo","szktkhr","osamX","muta244","milkmidi",
"heriet","dubfrog","flashrod","cda244","nulldesign","TX_298","yonatan","hiro_rec","katapad","enoeno",
"RoundRoom","Nicolas","dizgid","k__","gyuque","XELF","yshu","teageek","TheCoolMuseum","poiasd",
"y_tti","coppieeee","munegon","matsumos","KinkumaDesign","ish_xxxx","cjcat2266","kappaLab","runouw","iong"];


// Wonderfl API modules
//--------------------------------------------------
class WonderflAPI extends URLLoader {
    static public var apiKey:String = "", maxTrialCount:int = 3;
    static public function request(cmd:String, func:Function) : WonderflAPI { return new WonderflAPI(cmd, func); }
    
    private var _funcFinished:Function, _urlRequest:URLRequest, _trialCount:int=0;
    function WonderflAPI(cmd:String, func:Function) {
        super();
        _trialCount = maxTrialCount;
        _funcFinished = func;
        _urlRequest = new URLRequest("http://api.wonderfl.net/" + cmd + "?api_key=" + apiKey);
        addEventListener(Event.COMPLETE, _onComplete);
        addEventListener(IOErrorEvent.IO_ERROR, _onIOError);
        _request();
    }
    private function _request() : void {
        if (--_trialCount < 0) _onFinished(null);
        else load(_urlRequest);
    }
    private function _onComplete(e:Event) : void {
        var obj:* = JSON.decode(data as String);
        if (obj.stat=="fail") _request();
        else _onFinished(obj);
    }
    private function _onIOError(e:IOErrorEvent) : void { _onFinished(null); }
    private function _onFinished(obj:*) : void {
        removeEventListener(Event.COMPLETE, _onComplete);
        removeEventListener(IOErrorEvent.IO_ERROR, _onIOError);
        _funcFinished(obj);
    }
}

// User data
class WonderflUserData {
    private var _userName:String = "", _codes:Array = [];
    private var _requestedCount:int = -1, _loadedCount:int = 0, _progRate:Number = 1;
    private var _userIcon:Loader = new Loader();
    private var _funcFinished:Function = null;
    
    public function get isAvailable() : Boolean { return (_requestedCount == _loadedCount); }
    public function get progress() : Number { return _loadedCount * _progRate; }
    public function get userName() : String { return _userName; }
    public function get userIcon() : Loader { return _userIcon; }
    public function get codes() : Array { return _codes; }
    
    function WonderflUserData() { }
    
    public function clear() : void {
        if (_funcFinished != null) _funcFinished(null);
        _funcFinished = null;
        _userName = "";
        _codes = [];
        _requestedCount = -1;
        _progRate = 1;
        _loadedCount = 0;
    }
    
    public function load(name:String, funcFinished:Function=null) : void {
        clear();
        _funcFinished = funcFinished;
        WonderflAPI.request("user/" + name, _requestUserData);
    }
    
    private function _requestUserData(obj:*) : void {
        if (obj != null) {
            _userName = obj.user.name;
            FLoadUtil.load(obj.user.icon, _userIcon, _onLoaded, _onLoaded);
            WonderflAPI.request("user/" + _userName + "/codes", _requestCodeData); 
        } else clear();
    }
    
    private function _requestCodeData(obj:*) : void {
        if (obj!=null && obj.codes.length>0) {
            _requestedCount = obj.codes.length * 2 + 1; // length * (thumbnail + code) + icon
            _progRate = 1 / _requestedCount;
            for each (var c:* in obj.codes) { WonderflAPI.request("code/" + c.id, _recieveCodeData); }
        } else clear();
    }
    
    private function _recieveCodeData(obj:*) : void {
        if (obj != null && obj.code.compile_ok == 1) {
            var codeData:WonderflCodeData = new WonderflCodeData(this, obj.code);
            FLoadUtil.load(obj.code.thumbnail, codeData.thumbnail, _onLoaded, _onLoaded);
            _codes.push(codeData);
        } else {
            _loadedCount++; // thumbnail not read
        }
        _onLoaded();
    }
    
    private function _onLoaded() : void {
        _loadedCount++;
        if (isAvailable) {
            codes.sortOn("sortNum", Array.DESCENDING | Array.NUMERIC);
            if (_funcFinished != null) _funcFinished(this); 
            _funcFinished = null; 
        }
    }


/**/
    public function dummy(funcFinished:Function) : void {
        _userName = "dummy" + String(int(Math.random()*10000));
        var favBase:Number = Math.random()*0.5+0.2;
        for (var i:int=0; i<12; i++) {
            var fav:int = (Math.random()<favBase)?0:int((((Math.random()+Math.random()+Math.random())-1.5)*100));
            if (fav<0) fav = -(fav>>1);
            var data: WonderflCodeData = new WonderflCodeData(this, {
                "id": (int(Math.random()*0xffffff)).toString(16),
                "title":"card"+int(i),
                "diff":0,
                "favorite_count":fav,
                "forked_count":0,
                "modified_date":i,
                "as3":" \n \n \n"
            });
            data.lineCount = Math.random() * 1000;
            _codes.push(data);
        }
        _requestedCount = _loadedCount = 1;
        _progRate = 1;
        
        var t:Timer = new Timer(500, 1), me:WonderflUserData = this;
        t.addEventListener("timer", function(e:Event):void { funcFinished(me); } );
        t.start();
    }
}

// Code data
class WonderflCodeData {
    public var thumbnail:Loader = new Loader();
    public var user:WonderflUserData, id:String, title:String;
    public var code:String, sortNum:int, parentID:String;
    public var diff:int, favoriteCount:int, forkedCount:int;
    public var lineCount:int, nullLineCount:int, libraries:*;
    
    function WonderflCodeData(user:WonderflUserData, obj:*) {
        this.user     = user;
        id            = obj.id;
        title         = obj.title;
        parentID      = obj.parent || "";
        diff          = obj.diff;
        favoriteCount = obj.favorite_count;
        forkedCount   = obj.forked_count;
        sortNum       = obj.modified_date;
        code          = obj.as3;
        _analyze();
    }

    public function checkLib(nameList:Array) : Boolean {
        for each (var n:String in nameList) if (n in libraries) return true;
        return false;
    }
    
    private function _analyze() : void {
        lineCount = nullLineCount = 0;
        libraries = {};
        var nullLine:RegExp = new RegExp("^\\s*(//.*)?$"), importer:RegExp = new RegExp("^\\s*import");
        for each (var line:String in code.replace(/[\r\n]+/g, '\n').match(/^.*$/gm)) {
            if (nullLine.test(line)) nullLineCount++;
            else if (importer.test(line)) __analyzeLib(line);
            else lineCount++;
        }
    }
    
    private function __analyzeLib(path:String) : void {
        for (var key:String in libPathes) if (path.search(libPathes[key]) != -1) libraries[key] = true;
    }
    
    static public var libPathes:* = {
        "as3corelib":"com.adobe.",
        "tweener":"caurina.transitions.",
        "tweenlite":"gs.",
        "tweenmax":"com.greensock.",
        "tweensy":"com.flashdynamix.motion.",
        "betweenas3":"org.libspark.betweenas3.",
        "progression":"jp.progression.",
        "thread":"org.libspark.thread.",
        "frocessing":"frocessing.",
        "stats":"net.hires.debug.",
        "papervision3d":"org.papervision3d.",
        "sandy3d":"sandy.",
        "alternativa3d":"alternativa.",
        "five3d":"five3D.",
        "as3ds":"de.polygonal.ds.",
        "box2d":"Box2D.",
        "jiglib":"jiglib.",
        "swfassist":"org.libspark.swfassist.",
        "minimalcomps":"com.bit101.components.",
        "union":"net.user1.",
        "sion":"org.si.sion.",
        "stardust":"idv.cjcat.stardust.",
        "funnel":"funnel.",
        "modestmaps":"com.modestmaps.",
        "googlemaps":"com.google.maps.",
        "flashmedia":"flash.media.",
        "flashnet":"flash.net."
    };
}